﻿using System.Runtime.Serialization;
using System.ServiceModel;

namespace Contracts
{
    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ICService))]
    public interface ICentralService
    {
        [OperationContract(IsInitiating = true)]
        void InitSubscription(UserData subjectAndLanguage);

        // Entendemos que não existe a necessidade de o cliente ficar à espera de resposta do servidor quando se quer desligar do sistema, 
        // daí esta operação ser OneWay. 
        // Do lado do serviço, este tem que se prevenir para o caso de entregar uma mensagem a um cliente que já não está ligado!
        [OperationContract(IsTerminating = true, IsOneWay = true)]
        void ExitSubscription(string subject);

        // estudar a necessidade ou melhor implementação se existir retorno
        // Esta operação também pode ser One Way. Dessa forma, o serviço tem que gerir os vários pedidos para entrega de mensagem com um buffer.
        // Este buffer poderá manter ordenadas as mensagens intra-cliente, isto é, a mensagem 1 do cliente 1 não é enviada primeiro que 
        //  a mensagem 2 desse mesmo cliente, mas pode ser enviada primeiro que uma mensagem que chegou antes.
        [OperationContract(IsOneWay = true)]
        void DeliverMessage(string language, string subject, string message);
    }

    // Interface de callback para os clientes
    // Este nome tem designação diferente no lado do cliente, a interface fica com o nome da interface do serviço mais o sufixo Callback
    public interface ICService
    {
        [OperationContract]
        void ReceiveMessage(string message);
    }

    [DataContract]
    public class UserData
    {
        [DataMember]
        public string Subject { get; set; }

        [DataMember]
        public string Language { get; set; }
    }
}
